using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Spine.Unity.Examples {
   /// <summary>
   /// 处理Spine动画事件并触发音频播放的示例类
   /// </summary>
   public class HandleEventWithAudioExample : MonoBehaviour {

       [Header("Spine动画组件")]
       public SkeletonAnimation skeletonAnimation;  // Spine动画控制器
       
       [SpineEvent(dataField: "skeletonAnimation", fallbackToTextField: true)]
       public string eventName;  // 要监听的Spine事件名称

       [Space(10)]
       [Header("音频设置")]
       public AudioSource audioSource;  // 音频播放器组件
       public AudioClip audioClip;      // 要播放的音频片段
       public float basePitch = 1f;   // 基础音调
       public float randomPitchOffset = 0.1f; // 随机音调偏移量（用于增加音效变化）

       [Space(10)]
       [Header("调试选项")]
       public bool logDebugMessage = false; // 是否输出调试日志

       private Spine.EventData eventData; // 缓存的Spine事件数据引用

       /// <summary>
       /// 验证并自动获取组件引用
       /// </summary>
       void OnValidate () {
           // 如果未指定SkeletonAnimation组件，则尝试从同一对象获取
           if (skeletonAnimation == null) GetComponent<SkeletonAnimation>();
           
           // 如果未指定AudioSource组件，则尝试从同一对象获取
           if (audioSource == null) GetComponent<AudioSource>();
       }

       /// <summary>
       /// 初始化组件和事件监听
       /// </summary>
       void Start () {
           // 检查必要组件是否存在
           if (audioSource == null || skeletonAnimation == null) return;
           
           // 初始化SkeletonAnimation组件
           skeletonAnimation.Initialize(false);
           if (!skeletonAnimation.valid) return;

           // 查找并缓存指定事件的数据引用
           eventData = skeletonAnimation.Skeleton.Data.FindEvent(eventName);
           
           // 注册动画事件监听器
           skeletonAnimation.AnimationState.Event += HandleAnimationStateEvent;
       }

       /// <summary>
       /// 处理动画事件回调
       /// </summary>
       private void HandleAnimationStateEvent (TrackEntry trackEntry, Event e) {
           // 调试日志输出
           if (logDebugMessage) Debug.Log("触发事件: " + e.Data.Name);
           
           // 事件匹配
           bool eventMatch = (eventData == e.Data);
           if (eventMatch) {
               PlayAudio();  // 触发音频播放
           }
       }

       /// <summary>
       /// 播放配置的音频片段
       /// </summary>
       public void PlayAudio () {
           // 设置随机音调（在基础值附近波动）
           audioSource.pitch = basePitch + Random.Range(-randomPitchOffset, randomPitchOffset);
           
           // 指定要播放的音频片段
           audioSource.clip = audioClip;
           
           // 开始播放音频
           audioSource.Play();
       }
   }
}